//! Header for the  class
#ifndef MUSICCOLLECTION_H
#define MUSICCOLLECTION_H

#include <list>

#include "MusicMedia.h"

typedef std::list<MusicMedia*> TMedia ;
typedef TMedia::const_iterator TMediaConstIterator;

//! Represents a music collection
/*!
	This class represents a music collection. It can hold
	all Musicmedia (Songs, Albums and further MusicCollection).
	\class MusicCollection
	\author Thomas Pfeiffer
	\date 06.12.2012
*/
class MusicCollection : public MusicMedia {
public:
	
	//! The Ctor for a Musiccollection
	/*!
	The CTor for a Musiccollection
	\param name The name of the MusicCollection
	*/
	MusicCollection ( std::string const& name) : MusicMedia(eMusicCollection, name) {}
	
	//! The Ctor for a Musiccollection used by albums
	/*!
	The CTor of a MusicCollection which is used by albums
	\param kind The Kind of the Musicmedia (most of the time an album)
	\param name The name of the MusicCollection.
	*/
	MusicCollection ( TMediaKind kind, std::string const& name) : MusicMedia(kind, name) {}

	//! Adds the Musicmedia mm to the list of media
	/*! 
	mm can be every kind of MusicMedia.
	\param mm The MusicMedia want to add.
	*/
	void Add (MusicMedia * mm);
	
	void Accept (IVisitor * visitor);

	//! Returns a pointer to the list of MusicMedia.
	/*!
		Returns a pointer to the list of MusicMedia.
		Is used by the visitors.
		\returns A const Pointer to the list of MusicMedia
	*/
	TMedia const* getMedia() const;
	
protected:
   //! The List of MusicMedia contained within the Musiccollection
	TMedia mMedia;
};

#endif